import sqlite3
import copy, os
from SqliteHandler import SqliteHandler
from SqlDict import SqlDict


BASE_DIR = os.path.dirname(os.path.abspath(__file__))

class Table2rate:

    
    rate_example = {'直接费':
                        {'直接工程费':
                            {'人工费':
                                {'技工费': 1, '普工费': 1},
                            '材料费':
                                {'主要材料费': 1, '辅助材料费': 1},
                            '机械使用费': 1,
                            '仪表使用费': 1,
                            },
                        '措施费':
                            {
                                '文明施工费':1,
                                '工地器材搬运费':1,
                                '工程干扰费':1,
                                '工程点交、场地清理费':1,
                                '临时设施费':1,
                                '工程车辆使用费':1,
                                '夜间施工增加费':1,
                                '冬雨季施工增加费':1,
                                '生产工具用具使用费':1,
                                '施工用水电蒸汽费':1,
                                '特殊地区施工增加费':1,
                                '已完工程及设备保护费':1,
                                '运土费':0,
                                '施工队伍调遣费': [1, 1],
                                '大型施工机械调遣费': [1, 1],
                            },
                        },
                    '间接费':
                        {
                            '规费':
                            {
                                '工程排污费':0,
                                '社会保障费':1,
                                '住房公积金':1,
                                '危险作业意外伤害保险费':1.00,
                            },
                            '企业管理费':1.4,
                        },
                    '利润':1.0,
                    '销项税额':11.0,
                    }
    
    def __init__(self, prototype='book1', *args, **kwargs):

        # prototype 参数 book1 电源设备 book2 有线设备 book3 无线设备 book4 线路工程 book5 管道工程
        # **kwargs 中参数 sc2en_dis:现场到企业距离(km) 35km以内不计取施工队伍调遣费
        # **kwargs 中参数 local:施工省份(必填); specarea:特殊地区（1，2，3）; earth:运土费系数
        # **kwargs 中参数 mech:技工工日； work：普工工日。大型机械调遣距离 mach_dis,大型机械吨位 ton
        # path 为db绝对路径
        self.rate = copy.deepcopy(self.rate_example)
        self.path = kwargs.get('path', 0)
        self.conn = SqliteHandler(self.path)
        prototype = prototype
        mech = kwargs.get('mech', 0)
        work = kwargs.get('work', 0)
        sc2en_dis = kwargs.get('sc2en_dis', 0)
        local = kwargs.get('local', '其他')
        specarea = kwargs.get('specarea', None)
        mach_dis = kwargs.get('mach_dis', 0)
        ton = kwargs.get('ton', 0)
        earth = kwargs.get('earth', 0)

        data = self.get_type1_rate(prototype, sc2en_dis, mech, work)
        for i in data:
            self.filldictitem(self.rate, i, data[i])

        data = self.get_type2_rate(prototype, sc2en_dis)
        for i in data:
            self.filldictitem(self.rate, i, data[i])

        data = self.get_type3_rate(prototype, local, specarea)
        for i in data:
            self.filldictitem(self.rate, i, data[i])
            
        data = self.get_type4_rate(ton, mach_dis)
        for i in data:
            self.filldictitem(self.rate, i, data[i])
            
        data = self.get_type5_rate()
        for i in data:
            self.filldictitem(self.rate, i, data[i])

        data = self.get_type6_rate(earth)
        for i in data:
            self.filldictitem(self.rate, i, data[i])


        self.conn.close()

    def getrate(self):
        return self.rate

    def customrate(self, *args, **kwargs):
        
        rate = self.getrate()
        for i in kwargs:
            self.filldictitem(rate, i, kwargs[i])
        
        return rate



    def get_type1_rate(self, prototype, sc2en_dis, mech=0, work=0):
        # 获取 表二 分册无关距离有关 相关费率：
        # 1、施工队伍调遣费 单程调遣费定额
        # 获取 表二 分册有关距离有关 相关费率：
        # 1、施工队伍调遣费 调遣人数
        tablelist = ['施工队伍调遣费 单程调遣费定额', '施工队伍调遣费 调遣人数123']
        if prototype in ['book4', 'book5']:
            tablelist[1] = '施工队伍调遣费 调遣人数45'
        dislist = [sc2en_dis, mech + work]
        dicttool = SqlDict()
        tablenamelist = [dicttool.geth2edict().get(i) for i in tablelist]
        returnlist = []
        for index, name in enumerate(tablenamelist):
            data = self.conn.select(name)
            data = self.cursor2list(data)
            for i in data:
                if ((i[2] > 0) and  (i[2] >= dislist[index]) and (i[1] < dislist[index])) or dislist[index] == 0:
                    returnlist.append(i[3])
                    break
                elif i == data[-1]:
                    rate = data[len(data) - 2][3] + i[3] * ((dislist[index] - data[len(data) - 1][1] ) // -i[2] + 1)
                    returnlist.append(rate)
                    break
        
        returndict = {'施工队伍调遣费':returnlist}
        
        return returndict

    def get_type2_rate(self, prototype, sc2en_dis):
        # 获取 表二 分册有关定值 相关费率：
        # 运保费、采购及保管费、辅助材料费、
        # 文明施工费、工地器材搬运费、工程干扰费、
        # 工程点交、场地清理费、临时设施费、
        # 工程车辆使用费、夜间施工增加费、
        # 生产工具用具使用费、已完工程及设备保护费、
        # 设备运输保险费, 共14个费率
        tablelist = ['运保费',
                    '采购及保管费',
                    '辅助材料费',
                    '文明施工费',
                    '工地器材搬运费',
                    '工程干扰费',
                    '工程点交、场地清理费',
                    '临时设施费1',
                    '工程车辆使用费',
                    '夜间施工增加费',
                    '生产工具用具使用费',
                    '已完工程及设备保护费',
                    '设备运输保险费',]
        dicttool = SqlDict()
        if sc2en_dis > 35:
            tablelist[tablelist.index('临时设施费1')] = '临时设施费2'
        tablenamelist = [dicttool.geth2edict().get(i) for i in tablelist]

        returndict = dict()
        for index, fee in enumerate(tablenamelist):
            data = self.conn.select(fee)
            data = self.cursor2list(data)
            for i in data:
                if i[1] == prototype:
                    returndict[tablelist[index]] = i[2]
                    break
        
        return returndict

    def get_type3_rate(self, prototype, location, specarea=None):
        # 分册有关地理有关
        # 冬雨季施工增加费 特殊地区施工增加费
        returndict = dict()

        namelist = ['wintfees', 'spicfees']
        namelist_cn = ['冬雨季施工增加费', '特殊地区施工增加费']
        locallist = [location, specarea]
        for index, name in enumerate(namelist):
            data = self.conn.select(name + '_locations')
            data = self.cursor2list(data)
            for i in data:
                if i[1] == locallist[index]:
                    locationnum = int(i[2])
                    break
                else:
                    locationnum = int(i[2])
            data = self.conn.select(name)
            data = self.cursor2list(data) 
            for i in data:
                if i[1] == prototype:
                    returndict[namelist_cn[index]] = i[locationnum + 2]
        if specarea is None:
            returndict['特殊地区施工增加费'] = 0
        
        
        return returndict

    def get_type4_rate(self, ton=0, mach_dis=0):
        # 分册无关吨位有关距离有关 :大型机械调遣费
        returndict = dict()
        data = self.conn.select('machfees')
        data = self.cursor2list(data)
        for i in data:
                if (i[2] >= ton) and (i[1] < ton):
                    if mach_dis > 100:
                        returndict['大型施工机械调遣费'] = [i[4], mach_dis]
                        break
                    else:
                        returndict['大型施工机械调遣费'] = [i[3], mach_dis]
                        break
        if len(returndict) == 0:
            returndict['大型施工机械调遣费'] = [0, 0]
        
        return returndict

    def get_type5_rate(self):
        # 分册无关 :规费
        returndict = dict()
        data = self.conn.select('fixefees')
        data = self.cursor2list(data)
        for i in data:
            returndict[i[1]] = i[2]

        return returndict

    def get_type6_rate(self, earth=0):
        # 按实际计列
        redict = dict()
        redict['运土费'] = earth
        redict['工程排污费'] = 1

        return redict


    def cursor2list(self, cursor):
        # 将cursor可迭代对象转换为list
        mylist = []
        for i in cursor:
            temp = []
            for j in i:
                temp.append(j)
            mylist.append(temp)

        return mylist

    def filldictitem(self, d, key, item):
        # 将item写入复杂字典对应的key,key不能有重复
        for i in d:
            if not isinstance(d[i], dict):
                if i == key:
                    d[i] = item
                    return
            else:
                self.filldictitem(d[i], key, item)

if __name__ == "__main__":
    path = os.path.join(BASE_DIR, 'db/rate.db')
    test = Table2rate('book4', ton=0, mach_dis=0, sc2en_dis=0, mech=500, work=501, path=path, earth=10000, local='黑龙江')
    data = test.getrate()
    print(data)